home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
OTHER_LA
/
QUINTA
/
SYMBOLIC.Q
< prev
next >
Wrap
Text File
|
1990-04-28
|
6KB
|
251 lines
; ----------------------------------------------------------------
; Symbolic Algebra in Quinta
; Eric W. Sink
ticks
"Defining classes" print cr flush
{} "func" "args" 2 >list "symbolic" generic subclass
[ 'args' sto 'func' sto ] symbolic setbld
{} {} "symbsum" symbolic subclass
[ _+_ swap rot swap symbolic bld ] symbsum setbld
{} {} "symbprod" symbolic subclass
[ _*_ swap rot swap symbolic bld ] symbprod setbld
{} {} "symbdiff" symbolic subclass
[ _-_ swap rot swap symbolic bld ] symbdiff setbld
{} {} "symbquot" symbolic subclass
[ _/_ swap rot swap symbolic bld ] symbquot setbld
{} {} "symbpow" symbolic subclass
[ _^_ swap rot swap symbolic bld ] symbpow setbld
{} {} "symbconst" symbolic subclass
[ symbolic bld ] symbconst setbld
{} {} "symbvar" symbolic subclass
[ symbolic bld ] symbvar setbld
{} {} "symbsin" symbolic subclass
[ _sin_ swap rot swap symbolic bld ] symbsin setbld
{} {} "symbcos" symbolic subclass
[ _cos_ swap rot swap symbolic bld ] symbcos setbld
{} {} "symbtan" symbolic subclass
[ _tan_ swap rot swap symbolic bld ] symbtan setbld
{} {} "symbsqrt" symbolic subclass
[ _sqrt_ swap rot swap symbolic bld ] symbsqrt setbld
{} {} "symbexp" symbolic subclass
[ _exp_ swap rot swap symbolic bld ] symbexp setbld
{} {} "symblog" symbolic subclass
[ _log_ swap rot swap symbolic bld ] symblog setbld
{} {} "symblog10" symbolic subclass
[ _log10_ swap rot swap symbolic bld ] symblog10 setbld
{} {} "symbalog" symbolic subclass
[ _alog_ swap rot swap symbolic bld ] symbalog setbld
{} {} "symbinv" symbolic subclass
[ _inv_ swap rot swap symbolic bld ] symbinv setbld
{} {} "symbneg" symbolic subclass
[ _neg_ swap rot swap symbolic bld ] symbneg setbld
"Done Defining classes" print cr flush
; ----------------------------------------------------------------
; Conversions to symbolics
[ {} symbconst new ] ">symbolic" pub quantity respond
[ {} symbvar new ] ">symbolic" pub variable respond
; ----------------------------------------------------------------
; Predicates for symbolic classes
; This set of functions could be replaced by classof checks
[ classof message same ] "message?" pub generic respond
[ func dup message? not swap classof variable same not and ]
"constant?" pub symbolic respond
[ func _+_ same ] "sum?" pub symbolic respond
[ func _*_ same ] "product?" pub symbolic respond
[ func _-_ same ] "difference?" pub symbolic respond
[ func _/_ same ] "quotient?" pub symbolic respond
; ----------------------------------------------------------------
; Definitions of eval
[ ] "eval" pub generic respond
[ rcl ] "eval" pub variable respond
[ "s" local [ s func ] [ s args _eval_ apply s func sendthru ]
s func message? cond ] "eval" pub symbolic respond
; ----------------------------------------------------------------
; Textual representation of symbolics
[ "s" local [ s func >str ] [ s func >str s args >str + ]
s constant? not cond ] ">str"
pub symbolic respond
; ----------------------------------------------------------------
; Arithmetic operations on symbolics
; Addition
[ "a" local "s" local
s func a s args cons symbsum new ]
"+" pub generic symbsum 2 >list respond
[ 2 >list symbsum new ]
"+" pub generic symbolic 2 >list respond
[ "s" local "a" local
s func a s args cons symbsum new ]
"+" pub symbsum generic 2 >list respond
[ 2 >list symbsum new ]
"+" pub symbolic generic 2 >list respond
; Multiplication
[ "a" local "s" local
s func a s args cons symbprod new ]
"*" pub generic symbprod 2 >list respond
[ 2 >list symbprod new ]
"*" pub generic symbolic 2 >list respond
[ "s" local "a" local
s func a s args cons symbprod new ]
"*" pub symbprod generic 2 >list respond
[ 2 >list symbprod new ]
"*" pub symbolic generic 2 >list respond
; Subtraction
[ "a" local "s" local
s func a s args cons symbdiff new ]
"-" pub generic symbdiff 2 >list respond
[ 2 >list symbdiff new ]
"-" pub generic symbolic 2 >list respond
[ "s" local "a" local
s func a s args cons symbdiff new ]
"-" pub symbdiff generic 2 >list respond
[ 2 >list symbdiff new ]
"-" pub symbolic generic 2 >list respond
; Division
[ "a" local "s" local
s func a s args cons symbquot new ]
"/" pub generic symbquot 2 >list respond
[ 2 >list symbquot new ]
"/" pub generic symbolic 2 >list respond
[ "s" local "a" local
s func a s args cons symbquot new ]
"/" pub symbquot generic 2 >list respond
[ 2 >list symbquot new ]
"/" pub symbolic generic 2 >list respond
; Exponentiation
[ "a" local "s" local
s func a s args cons symbpow new ]
"^" pub generic symbquot 2 >list respond
[ 2 >list symbpow new ]
"^" pub generic symbolic 2 >list respond
[ "s" local "a" local
s func a s args cons symbpow new ]
"^" pub symbpow generic 2 >list respond
[ 2 >list symbpow new ]
"^" pub symbolic generic 2 >list respond
; Misc functions
[ 1 >list symbexp new ]
"exp" pub symbolic respond
[ 1 >list symbsin new ]
"sin" pub symbolic respond
[ 1 >list symbcos new ]
"cos" pub symbolic respond
[ 1 >list symbtan new ]
"tan" pub symbolic respond
[ 1 >list symblog new ]
"log" pub symbolic respond
[ 1 >list symblog10 new ]
"log10" pub symbolic respond
[ 1 >list symbalog new ]
"alog" pub symbolic respond
[ 1 >list symbsqrt new ]
"sqrt" pub symbolic respond
[ 1 >list symbneg new ]
"neg" pub symbolic respond
[ 1 >list symbinv new ]
"inv" pub symbolic respond
; -----------------------------------------------------------------
; Derivation
[ "m" local "a" local "L" local L size "cnt" local
[ L car L cdr 'L' sto a m send ]
[ L isempty not ]
whiledo
cnt >list ]
"applyarg" pub message respond
[ drop2 0 ] "der" pub variable quantity 2 >list respond
[ "dv" local "e" local
[ 0 ]
[ 1 ]
dv e same cond ] "der" pub variable variable 2 >list respond
[ "dv" local "e" local e args dv _der_ applyarg sum]
"der" pub variable symbsum 2 >list respond
; This routine was written by Jurjen N.E. Bos (jurjen@cwi.nl)
; for the HP-28 calculator. Very little conversion was necessary
; for Quinta to handle it nicely. Also, I modified his code
; to always operate at the highest precision possible for SANE.
[ 15.0 neg alog 2 / "p" local "x" local 1 "a" local 0 "b" local
x [ inv dup ip abs a * b + a 'b' sto 'a' sto fp ]
[ x a * 0.5 + floor x a * - abs p a * >= ]
whiledo
drop x a * 0.5 + floor a >symbolic / ] "frac" pub float respond
ticks swap - 60 / >str " seconds to LOAD" + print cr